package service

import (
	"encoding/json"
	"reflect"
)

type gitRepository struct {
}

type GitReqModel struct {
	URI         string `json:"uri"`
	Name        string `json:"name"`
	Code        string `json:"code"`
	Operate     string `json:"operate"`
	RequestData string `json:"requestData"`
}

type GitRespModel struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
	Success bool   `json:"success"`
	Data    any    `json:"data"`
}

func formatResp(code int, msg string, data any) *GitRespModel {
	success := false
	if code/100 == 2 {
		success = true
	}
	return &GitRespModel{Code: code, Message: msg, Data: data, Success: success}
}

func (g *gitRepository) GitOperate(req *GitReqModel) *GitRespModel {
	// 根据req分流调用下面的具体方法
	if method, ok := reflect.TypeOf(g).MethodByName(req.Operate); !ok {
		return formatResp(400, "非法方法名称"+req.Operate, nil)
	} else {
		params := reflect.New(method.Type.In(1))
		err := json.Unmarshal([]byte(req.RequestData), params.Interface())
		if err != nil {
			return formatResp(400, err.Error(), nil)
		}
		result := method.Func.Call([]reflect.Value{reflect.ValueOf(g), params.Elem()})
		if len(result) > 0 {
			return result[0].Interface().(*GitRespModel)
		}
		return formatResp(500, "未知错误", nil)
	}
}

var GitRepository GitInterface

func init() {
	GitRepository = &gitRepository{}
}

type GitInterface interface {
	GitOperate(*GitReqModel) *GitRespModel
	/** 创建仓库 */
	CreateRepo(*CreateRepoModel) *GitRespModel
	//获取仓库内容
	RepoContent(*RepoContentModel) *GitRespModel
	/** 提交历史 */
	HistoryCommitList(*GetBranchCommitListModel) *GitRespModel
	/** 获取代码分支列表 默认活跃陈旧 */
	Codebranches(*GetCodeBranchModel) *GitRespModel
	/** 仓库设置->保护分支更改 */
	SetProtectedbranches(*BranchOperateReq) *GitRespModel
	/** 仓库设置->保护分支更改 */
	SetDefaultBranch(*BranchOperateReq) *GitRespModel
	/** 获取提交代码比对信息，文件对比 */
	Codecomparison(*CodeCompareModel) *GitRespModel
	/** PR列表内的提交史 */
	PRCommits(*PRCommitReqModel) *GitRespModel
	/** PR列表内的文件变动 */
	PRFiles(*PRCommitReqModel) *GitRespModel
	/** 创建pr请求比对 */
	PullRequestcomparison(*PRCompareReqModel) *GitRespModel
	/** 判断合并请求是否存在冲突 */
	IsPullRequestcomparison(*PRCompareReqModel) *GitRespModel
	/** 点击页面上的“合并请求” */
	MergePull(*MergePullRequest) *GitRespModel
	
	ListBriefBranchs(*GetCodeBranchModel) *GitRespModel
	
	Codesettingbranches(*SettingBranchModel) *GitRespModel
	// 查询PR列表
	ListPRInfo(*PRCommitReqModel) *GitRespModel
}
